﻿using Common;
using System.IO.Ports;
using System.Text;

namespace NewDevice.RS232
{
    /// <summary>
    /// 万用表DM3058E控制类
    /// 提供对DM3058E数字万用表的串口控制功能
    /// </summary>
    //public class Dm3058E
    //{
    //    private SerialBase _serial;
    //    private object _deviceName;
    //    public object _mylog { get; private set; } = null!;
    //    private bool _isConnect = false;

    //    // 静态构造函数，初始化量程参数,
    //    static Dm3058E()
    //    {
    //        // 直流电压量程参数 单位：V
    //        _setRangeParam.Add(Function.Dcv, new Dictionary<string, double>
    //        {
    //            {"0",0.2 }, {"1",2}, {"2",20}, {"3",200}, {"4",1000},
    //        });

    //        // 交流电压量程参数 单位：V
    //        _setRangeParam.Add(Function.Acv, new Dictionary<string, double>
    //        {
    //            {"0",0.2 }, {"1",2}, {"2",20}, {"3",200}, {"4",750},
    //        });

    //        // 直流电流量程参数 单位：A
    //        _setRangeParam.Add(Function.Dci, new Dictionary<string, double>
    //        {
    //            {"0",0.0002 }, {"1",0.002}, {"2",0.02}, {"3",0.2}, {"4",2},{"5",10}
    //        });

    //        // 交流电流量程参数 单位：A
    //        _setRangeParam.Add(Function.Aci, new Dictionary<string, double>
    //        {
    //            {"0",0.02 }, {"1",0.2}, {"2",2}, {"3",10}
    //        });

    //        // 二线电阻测量量程 单位：Ω
    //        _setRangeParam.Add(Function.Wr2, new Dictionary<string, double>
    //        {
    //            {"0",200 }, {"1",2000}, {"2",20000}, {"3",200000}, {"4",2000000},{"5",10000000},{"6",100000000}
    //        });

    //        // 四线电阻测量量程 单位：Ω
    //        _setRangeParam.Add(Function.Wr4, new Dictionary<string, double>
    //        {
    //            {"0",200 }, {"1",2000}, {"2",20000}, {"3",200000}, {"4",1000000},{"5",10000000},{"6",100000000}
    //        });

    //        // 频率测量时输入信号的电压量程 单位：V
    //        _setRangeParam.Add(Function.Freq, new Dictionary<string, double>
    //        {
    //            {"0",0.2 }, {"1",2}, {"2",20}, {"3",200}, {"4",750},
    //        });

    //        // 周期测量时输入电压的量程 单位：V
    //        _setRangeParam.Add(Function.Peri, new Dictionary<string, double>
    //        {
    //            {"0",0.2 }, {"1",2}, {"2",20}, {"3",200}, {"4",750},
    //        });

    //        // 短路测量时的极限电阻值 单位：Ω
    //        _setRangeParam.Add(Function.Cont, new Dictionary<string, double>
    //        {
    //            {"MIN",1 }, {"MAX",2000}
    //        });

    //        // 电容测量量程 单位：微法，最大量程位10毫法
    //        _setRangeParam.Add(Function.Cap, new Dictionary<string, double>
    //        {
    //            {"0",0.002 }, {"1",0.02}, {"2",0.2}, {"3",2}, {"4",200},{"5",10000}
    //        });
    //    }

    //    /// <summary>
    //    /// 构造函数
    //    /// </summary>
    //    /// <param name="deviceName">设备名称，默认为"万用表DM3058E"</param>
    //    public Dm3058E(string deviceName = "万用表DM3058E")
    //    {
    //        _deviceName = deviceName;
    //        _serial = new SerialBase()
    //        {
    //            DeviceName = deviceName
    //        };
    //    }

    //    /// <summary>
    //    /// 设置测试精度指令映射
    //    /// 存储各功能对应的量程参数
    //    /// </summary>
    //    private static readonly Dictionary<Function, Dictionary<string, double>> _setRangeParam = new Dictionary<Function, Dictionary<string, double>>();

    //    /// <summary>
    //    /// 获取量程命令映射
    //    /// 存储各功能对应的获取量程命令
    //    /// </summary>
    //    private static readonly IReadOnlyDictionary<Function, string> _getRangeCmd = new Dictionary<Function, string>
    //        {
    //            {Function.Dcv,":MEASure:VOLTage:DC" },
    //            {Function.Acv,":MEASure:VOLTage:AC" },
    //            {Function.Dci,":MEASure:CURRent:DC" },
    //            {Function.Aci,":MEASure:CURRent:AC" },
    //            {Function.Wr2,":MEASure:RESistance" },
    //            {Function.Wr4,":MEASure:FRESistance" },
    //            {Function.Freq,":MEASure:FREQuency" },
    //            {Function.Peri,":MEASure:PERiod" },
    //            {Function.Cont,":MEASure:CONTinuity" },
    //            {Function.Cap,":MEASure:CAPacitance" }
    //        };

    //    /// <summary>
    //    /// 设置功能命令映射
    //    /// 存储各功能对应的设置命令
    //    /// </summary>
    //    private static readonly Dictionary<Function, string> _setFunctionCmd = new Dictionary<Function, string>
    //        {
    //            { Function.Dcv,":FUNCtion:VOLTage:DC"},
    //            { Function.Acv,":FUNCtion:VOLTage:AC"},
    //            { Function.Dci,":FUNCtion:CURRent:DC"},
    //            { Function.Aci,":FUNCtion:CURRent:AC"},
    //            { Function.Wr2,":FUNCtion:RESistance"},
    //            { Function.Wr4,":FUNCtion:FRESistance"},
    //            { Function.Freq,":FUNCtion:FREQuency"},
    //            { Function.Peri,":FUNCtion:PERiod"},
    //            { Function.Cont,":FUNCtion:CONTinuity"},
    //            { Function.Diode,":FUNCtion:DIODe"},
    //            { Function.Cap,":FUNCtion:CAPacitance"}
    //        };

    //    /// <summary>
    //    /// 命令结束符
    //    /// </summary>
    //    private const string StopCode = "\r\n";

    //    /// <summary>
    //    /// 读取当前设备状态
    //    /// </summary>
    //    /// <returns>当前功能枚举值</returns>
    //    //public async Task<Function> GetFunction()
    //    //{
    //    //    string result = await SendAsciiStringAndWaitResponse(":FUNCtion?" + StopCode);

    //    //    // 处理特殊返回值
    //    //    if (result == "2WR")
    //    //    {
    //    //        result = "Wr2";
    //    //    }
    //    //    else if (result == "4WR")
    //    //    {
    //    //        result = "Wr4";
    //    //    }

    //    //    // 匹配枚举值
    //    //    foreach (Function item in Enum.GetValues(typeof(Function)))
    //    //    {
    //    //        if (result == item.ToString())
    //    //        {
    //    //            Function = item;
    //    //            return item;
    //    //        }
    //    //    }
    //    //    return 0;
    //    //}

    //    /// <summary>
    //    /// 设置量程
    //    /// </summary>
    //    /// <param name="value">要设置的量程值</param>
    //    /// <exception cref="Exception">当量程值超出范围时抛出异常</exception>
    //    public void SetRange(double value)
    //    {
    //        // 二极管测试不需要设置量程
    //        if (Function == Function.Diode)
    //        {
    //            return;
    //        }

    //        string cmd = "";
    //        string cmdHead = _getRangeCmd[Function];

    //        // 短路测试特殊处理
    //        if (Function == Function.Cont)
    //        {
    //            double max = _setRangeParam[Function]["MAX"];
    //            double min = _setRangeParam[Function]["MIN"];
    //            if (value > max | value < min)
    //            {
    //                throw new Exception($"{Function.ToString()}参数错误{value}");
    //            }
    //            cmd = cmdHead + " " + (int)value;
    //        }
    //        else
    //        {
    //            bool update = false;
    //            var param = _setRangeParam[Function];

    //            // 查找合适的量程
    //            foreach (var item in param)
    //            {
    //                if (item.Value >= value)
    //                {
    //                    cmd = cmdHead + " " + item.Key;
    //                    update = true;
    //                    break;
    //                }
    //            }

    //            if (!update)
    //            {
    //                throw new Exception($"{Function.ToString()}错误的量程{value}");
    //            }
    //        }

    //        // 发送设置命令
    //        _ = _serial.SendAscii(cmd + StopCode);
    //    }

    //    /// <summary>
    //    /// 获取当前量程
    //    /// </summary>
    //    /// <returns>当前量程字符串</returns>
    //    //public async Task<string> GetRange()
    //    //{
    //    //    string cmd = _getRangeCmd[Function] + ":RANGe?";
    //    //    string result = await SendAsciiStringAndWaitResponse(cmd + StopCode);
    //    //    return result;
    //    //}

    //    /// <summary>
    //    /// 设置当前万用表功能
    //    /// </summary>
    //    /// <param name="func">要设置的功能枚举</param>
    //    /// <exception cref="Exception">当设置失败时抛出异常</exception>
    //    public async void SetFunction(Function func)
    //    {
    //        try
    //        {
    //            string cmd = _setFunctionCmd[func];
    //            await _serial.SendAscii(cmd + StopCode);
    //            Thread.Sleep(500);  // 等待设备响应

    //            //验证设置是否成功
    //            if (func != await GetFunction())
    //            {
    //                throw new Exception($"{_deviceName} 设置{func}功能异常");
    //            }
    //        }
    //        catch (Exception e)
    //        {
    //            MyLog.Error(e);
    //        }
    //    }

    //    /// <summary>
    //    /// 当前功能属性
    //    /// </summary>
    //    public Function Function { get; set; }

    //    /// <summary>
    //    /// 获取当前功能状态的值
    //    /// </summary>
    //    /// <returns>测量值</returns>
    //    public async Task<double> GetValue()
    //    {
    //        string cmd = _getRangeCmd[Function] + "?";
    //        double result = double.Parse(await SendAsciiStringAndWaitResponse(cmd + StopCode));
    //        MyLog.Info(deviceName: (string)_deviceName, message: $"FUNC={Function.ToString()},Value=[{result}]");
    //        return result;
    //    }

    //    /// <summary>
    //    /// 连接设备
    //    /// </summary>

    //    public void Connect(string portName, int baudRate = 9600, int dataBits = 8,
    //        StopBits stopBits = StopBits.One, Parity parity = Parity.None)
    //    {
    //        if (_isConnect)
    //        {
    //            throw new Exception($"设备{_deviceName}已连接！！！请勿再连接");
    //        }

    //        _serial.Connect(portName, baudRate = 9600, dataBits = 8,
    //             StopBits.One, Parity.None);
    //        _isConnect = true;
    //    }

    //    /// <summary>
    //    /// 断开连接
    //    /// </summary>
    //    public void Dispose()
    //    {
    //        _isConnect = false;
    //        _serial.Dispose();
    //    }

    //    /// <summary>
    //    /// 发送Ascii字符串并等待返回值
    //    /// </summary>
    //    private string SendAsciiStringAndWaitResponse(string msg)
    //    {
    //        if (_isConnect)
    //        {
    //            throw new Exception($"设备{_deviceName}未连接！！！请连接");
    //        }

    //         _serial.SendAscii(msg);
    //        byte[] bytes = await _serial.ReceiveAsync(TimeSpan.FromMilliseconds(500));

    //        var receivemesage = Encoding.ASCII.GetString(bytes);

    //        return receivemesage;
    //    }
    //}

    /// <summary>
    /// 万用表功能枚举
    /// </summary>
    public enum Function
    {
        /// <summary>
        /// 直流电压测量功能
        /// </summary>
        Dcv,

        /// <summary>
        /// 交流电压测量功能
        /// </summary>
        Acv,

        /// <summary>
        /// 直流电流测量功能
        /// </summary>
        Dci,

        /// <summary>
        /// 交流电流测量功能
        /// </summary>
        Aci,

        /// <summary>
        /// 二线电阻测量功能
        /// </summary>
        Wr2,

        /// <summary>
        /// 四线电阻测量功能
        /// </summary>
        Wr4,

        /// <summary>
        /// 频率测量功能
        /// </summary>
        Freq,

        /// <summary>
        /// 周期测量功能
        /// </summary>
        Peri,

        /// <summary>
        /// 短路测量功能
        /// </summary>
        Cont,

        /// <summary>
        /// 二极管测量功能
        /// </summary>
        Diode,

        /// <summary>
        /// 电容测量功能
        /// </summary>
        Cap
    }
}